<?php

namespace Model;

class Database {
	
	private $mysqli = null;
	public $salt = null;
	
	// Ansluter till databasen
	public function connect(DBConfig $config) {
		
		$this->mysqli = new \mysqli($config->host, $config->user, $config->pass, $config->db);
		$this->salt = $config->salt;
		
		if ($this->mysqli->connect_error) {
			throw new Exception($this->mysqli->connect_error);
		}
		
		$this->mysqli->set_charset("utf8");
		
		return true;
		
	}
	
	// Förbereder SQL-fråga
	public function prepare($sql) {
		
		$prepared = $this->mysqli->prepare($sql);
		
		if (!$prepared) {
			throw new Exception($this->mysqli->error);
		}
		
		return $prepared;
		
	}
	
	// Utför en SQL-fråga för att hämta ett värde
	public function select_one($stmt) {
		
		if (!$stmt) {
			throw new Exception($this->mysqli->error);
		}
		
		if (!$stmt->execute()) {
			throw new Exception($this->mysqli->error);
		}
		
		$return = null;
		
		if (!$stmt->bind_result($return)) {
			throw new Exception($this->mysqli->error);
		}
		
		$stmt->fetch();
		$stmt->close();
		
		return $return;
		
	}
	
	// Utför INSERT- och DELETE-frågor
	public function query($stmt) {
		
		if (!$stmt) {
			throw new Exception($this->mysqli->error);
		}
		
		if (!$stmt->execute()) {
			throw new Exception($this->mysqli->error);
		}
		
		$stmt->close();
		
		return true;
		
	}
	
	// Stänger anslutningen
	public function close() {
		return $this->mysqli->close();
	}
	
	// Testar databasfunktioner
	public function test(DBConfig $db_config) {
		
		$db = new Database();
		
		// Kolla att anslutningen fungerar
		if (!$db->connect($db_config)) {
			echo "Fel: Databasanslutning misslyckades.";
			return false;
		}
		
		// Kolla att SELECT-frågor fungerar
		$stmt = $db->prepare("SELECT COUNT(*) FROM test");
		if ($db->select_one($stmt) != 1) {
			echo "Fel: Funktionen select_one() misslyckades.";
			return false;
		}
		
		// Kolla att INSERT-frågor fungerar
		$stmt = $db->prepare("SELECT COUNT(*) FROM insert_test");
		$posts_before = $db->select_one($stmt);
		
		$stmt = $db->prepare("INSERT INTO insert_test");
		$stmt = $db->query($stmt);
		
		$stmt = $db->prepare("SELECT COUNT(*) FROM insert_test");
		$posts_after = $db->select_one($stmt);
		
		if ($posts_after - $posts_before != 1) {
			echo "Fel: Funktionen prepare() eller query() misslyckades.";
			return false;
		}
		
		// Kolla att anslutningen stängs
		if (!$db->close()) {
			echo "Fel: Stängning av databasanslutning misslyckades.";
			return false;
		}
		
		// Lyckat test
		return true;
		
	}
	
}

?>